import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Clase del jugador principal, se manejan sus movimientos, sus colisiones, sus poderes, 
 * en caso de que lo toque un enemigo hacerlo perder, o disminuir vidas. Se valida
 * todo lo que tiene que ver con el jugador principal
 * 
 * @autor Irma Delgado
 * @versión  noviembre/2014
 */
public class Bob extends Actor
{
        public static final int ARRIBA = 0; //variable estatica para definir la direccion
        public static final int ABAJO = 1; //variable estatica para definir la direccion
        public static final int IZQUIERDA = 2; //variable estatica para definir la direccion
        public static final int DERECHA = 3; //variable estatica para definir la direccion
        private int valor;
        private int valor2;
        private int bombas;
        private int speed;//velocidad en la que se mueve el jugador
        private int direccion; //variable para saber la direccion
        private boolean poderEstrella;//bandera para saber si ha tocado la estrella
        private boolean poderEscudo;//bandera para saber si ha tocado el escudo
        private boolean cambiarScroll;//bandera para hacer el cambio de scroll
        private boolean poderBomba;//bandera para checar si se ha tocado la superBomba
        private boolean cambiarNivel; //bandera para cambiar de nivel
        private boolean scroll;
        private int contadorBombas;//bandera para saber el numero de bombas disponibles
        private final GreenfootImage AbajoBob = new GreenfootImage("Abajo.png"); //imagenes del jugador principal
        private final GreenfootImage ArribaBob = new GreenfootImage("arriba.png");
        private final GreenfootImage AbajoEstrella = new GreenfootImage("AbajoE.png");
        private final GreenfootImage ArribaEstrella = new GreenfootImage("arribaE.png");
        private final GreenfootImage AbajoEscudo = new GreenfootImage("AbajoP.png");
        private final GreenfootImage ArribaEscudo = new GreenfootImage("arribaP.png");
        private int  tiempoAnimacion;//Sirve para hacer el cambio de imagen
        
        
        
        private GreenfootSound estrella;
        private GreenfootSound escudo;
        private GreenfootSound vida;
        private GreenfootSound llave;
        
        
        private final GreenfootImage[] EstrellaDer = new GreenfootImage[4];//Arreglo de la imagenes de caminar Derecha de el jugador
        private final GreenfootImage[] EstrellaIzq = new GreenfootImage[4];//Arreglo para las imagenes de caminar Izquierda de el jugador
        private final GreenfootImage[] EscudoDer = new GreenfootImage[4];//Arreglo de la imagenes de caminar Derecha de el jugador
        private final GreenfootImage[] EscudoIzq = new GreenfootImage[4];//Arreglo para las imagenes de caminar Izquierda de el jugador
        private final GreenfootImage[] ImagensDer = new GreenfootImage[4];//Arreglo de la imagenes de caminar Derecha de el jugador
        private final GreenfootImage[] ImagensIzq = new GreenfootImage[4];//Arreglo para las imagenes de caminar Izquierda de el jugador
        private SimpleTimer timer = new SimpleTimer();
  
        /**Constructor de la clase Bob, se inicializan todas las banderas y variables, y se cargan las imagenes en sus respectivos arreglos
           */
        
           public Bob()
        {
            //velX=5;
            //velY=5;
            speed = 4;
            valor=1;
            valor2=1;
            bombas=0;
            contadorBombas=2;
            tiempoAnimacion=0;
            direccion=ABAJO;
            poderEstrella=false;
            poderEscudo=false;
            poderBomba=false;
            cambiarNivel=false;
            cambiarScroll=false;
            scroll=false;
            timer.mark();
            for(int i = 0; i<4; i++)//carga la de la izquierda
              ImagensIzq[i] = new GreenfootImage("Bob"+i+".png");
            for(int i = 0; i<4; i++)//carga la de la izquierda
              EstrellaIzq[i] = new GreenfootImage("BobE"+i+".png");
             for(int i = 0; i<4; i++)//carga la de la izquierda
              EscudoIzq[i] = new GreenfootImage("BobP"+i+".png");
            
             for(int i = 0; i<4; i++)//carga imagenes de la izquierda y aplica mirror para "crear" las de la derecha 
                {
                 ImagensDer[i] = new GreenfootImage(ImagensIzq[i]);
                 ImagensDer[i].mirrorHorizontally();
                }
             
             for(int i = 0; i<4; i++)//carga imagenes de la izquierda y aplica mirror para "crear" las de la derecha 
                {
                 EstrellaDer[i] = new GreenfootImage(EstrellaIzq[i]);
                 EstrellaDer[i].mirrorHorizontally();
                }
                 for(int i = 0; i<4; i++)//carga imagenes de la izquierda y aplica mirror para "crear" las de la derecha 
                {
                 EscudoDer[i] = new GreenfootImage(EscudoIzq[i]);
                 EscudoDer[i].mirrorHorizontally();
                }
            
                escudo = new GreenfootSound("Escudo.mp3");
                estrella = new GreenfootSound("Estrella.mp3");
                vida= new GreenfootSound("NuevaVida.mp3");
                llave= new GreenfootSound("Llave.wav");
        }
            
    /**
     * Actua del jugador, donde se checa el movimiento de este, y si choca con algun otro objeto, hacer lo que le pertenece
     */
    public void act() 
    {
        Pared blk=(Pared)getOneIntersectingObject(Pared.class);
        Plant wll=(Plant)getOneIntersectingObject(Plant.class);
        if(blk!=null || wll!=null){
            setLocation(getX(),getY());
        }
        else{
            if(Greenfoot.isKeyDown("up"))
            {
                moverArriba();    
                release_up();
                
            }
            if(Greenfoot.isKeyDown("left"))
            {
                moverIzquierda();
                release_left();
                
            }
            if(Greenfoot.isKeyDown("right"))
            {
                moverDerecha();
                release_right();
                
            }
            if(Greenfoot.isKeyDown("down"))
            {
                moverAbajo();    
                release_down();
                
            }
        }
        if(bombas==0)
        {
            creaBomba();
            //bombas=1;
        }
        checaEnemigos();
        checaPoderVida();
        checaPoderEstrella();
        checaPoderEscudo();
        checaPoderBomba();
        checaLlaves();
        checaScroll();
        //checaGana();
       
       if(timer.millisElapsed()>8000)
        {
            estrella.pause();
            poderEstrella=false;  
        }
        if(contadorBombas==0)
        {
            poderBomba=false;
            contadorBombas=0;
            
        }
        if(timer.millisElapsed()>8000)
        {
            poderEscudo=false;  
        }
        if(cambiarNivel==true&&valor==1)
        {
            checaNivele2();
            cambiarNivel=false;   
        }
        if(cambiarNivel==true&&valor2==2)
        {
            checaNivel3();
            cambiarNivel=false;   
        }
        
        checaMuerte();
       
    }
    
    /**Metodo para obtener el numero de la superBomba*/
    public int getBomba()
    {
        return bombas;
    }
    
    /**Mtodo para modificar el numero de la superBomba*/
    public void setBomba(int valor)
    {
        bombas=valor;
    }
    
    /**Checa si ya paso al nivel 2*/
    public void checaNivele2()
        {
             if(((MundoBob)getWorld()).getNivel()==2)
            {
                ((MundoBob)getWorld()).preparaNivel2();
               valor=2;
               valor2=2;
            }
        }
        
    /**Checa si ya paso al nivel 3*/
        public void checaNivel3()
        {
             if(((MundoBob)getWorld()).getLlaves()==12)
            {
                ((MundoBob)getWorld()).preparaNivel3();
                valor2=3;
                
            }

        }
        
    /**Checa el scroll para hacer los cambios de pantalla*/
        public void checaScroll()
        {
             if(((MundoBob)getWorld()).getLlaves()==3)
             {
                 if(this.getX()>=getWorld().getWidth()-30)
                 {
                     //cambiarScroll=true;
                      ((MundoBob)getWorld()).preparaNivel_12();
                 }
             }  
             if(((MundoBob)getWorld()).getLlaves()==6)
             {
                 //Greenfoot.delay(10);
                 ((MundoBob)getWorld()).setNivel(2);
                 cambiarNivel=true;
                 
                }  
                 if(((MundoBob)getWorld()).getLlaves()==9)
                 {
                
                 if(this.getX()>=getWorld().getWidth()-30)
                 {
                     //cambiarScroll=true;
                      ((MundoBob)getWorld()).preparaNivel_22();
                 }

                  
                }
                if(((MundoBob)getWorld()).getLlaves()==12)
                {
                 //Greenfoot.delay(10);
                 ((MundoBob)getWorld()).setNivel(3);
                 cambiarNivel=true;
                 
                }  
             
        }
       
    /**
     * Metodo para mover el jugador hacia arriba
       */
    public void moverArriba()
        {
            direccion=ARRIBA;
            if(poderEstrella==true)
                this.setImage(ArribaEstrella);
            if(poderEscudo==true)
                this.setImage(ArribaEscudo);
            if(poderEstrella==false&&poderEscudo==false)
                this.setImage(ArribaBob);
            
            setLocation(this.getX(),this.getY()-speed);//-5
               
        }
        /**
         * Metodo para mover al jugador hacia abajo
           */
        public void moverAbajo()
        {
            direccion=ABAJO;
             if(poderEstrella==true)
                this.setImage(AbajoEstrella);
                
             if(poderEscudo==true)
                this.setImage(AbajoEscudo);
             if(poderEstrella==false&&poderEscudo==false)
                this.setImage(AbajoBob);
            setLocation(this.getX(),this.getY()+speed);   
        }
        /**
         * Metodo para mover al jugador hacia la derecha, cambiando el sprite para simular la caminata, en caso de tocar estrella/escudo tambien cambia sprite
           */
        public void moverDerecha()
            {
               if(poderEstrella==false&&poderEscudo==false)
               {
                tiempoAnimacion++;
               if(tiempoAnimacion<2)
                     this.setImage(ImagensDer[0]);
               else 
                    if(tiempoAnimacion<4)
                         this.setImage(ImagensDer[1]);
                    else
                        if(tiempoAnimacion<6)
                            this.setImage(ImagensDer[2]);
                        else           
                            if(tiempoAnimacion<8)
                                this.setImage(ImagensDer[3]);
                            else 
                                if(tiempoAnimacion==10)
                                    tiempoAnimacion=0;
                }
                else
                  if(poderEstrella==true)
                      {
                      tiempoAnimacion++;
                   if(tiempoAnimacion<2)
                         this.setImage(EstrellaDer[0]);
                   else 
                        if(tiempoAnimacion<4)
                             this.setImage(EstrellaDer[1]);
                        else
                            if(tiempoAnimacion<6)
                                this.setImage(EstrellaDer[2]);
                            else           
                                if(tiempoAnimacion<8)
                                    this.setImage(EstrellaDer[3]);
                                else 
                                    if(tiempoAnimacion==10)
                                        tiempoAnimacion=0;
                        }
                  else
                    if(poderEscudo==true)
                    {
                        tiempoAnimacion++;
                   if(tiempoAnimacion<2)
                         this.setImage(EscudoDer[0]);
                   else 
                        if(tiempoAnimacion<4)
                             this.setImage(EscudoDer[1]);
                        else
                            if(tiempoAnimacion<6)
                                this.setImage(EscudoDer[2]);
                            else           
                                if(tiempoAnimacion<8)
                                    this.setImage(EscudoDer[3]);
                                else 
                                    if(tiempoAnimacion==10)
                                        tiempoAnimacion=0;
                    }
                setLocation(this.getX()+speed,this.getY());
                //System.out.println("derecha");
                direccion=DERECHA;
            }
            /**
             * Metodo para mover el jugador a la izquierda, cambia los sprites para simular caminata, en caso de que tenga escudo/estrella cambia tmbn de dibujo
               */
     public void moverIzquierda()
             {
               if(poderEstrella==false&&poderEscudo==false)
               {
                tiempoAnimacion++;
                 if(tiempoAnimacion<2)
                     this.setImage(ImagensIzq[0]);
               else 
                    if(tiempoAnimacion<4)
                         this.setImage(ImagensIzq[1]);
                    else
                        if(tiempoAnimacion<6)
                            this.setImage(ImagensIzq[2]);
                            else           
                            if(tiempoAnimacion<8)
                                this.setImage(ImagensIzq[3]);
                            else 
                                if(tiempoAnimacion==10)
                                    tiempoAnimacion=0;
               }else
                 if(poderEstrella==true)
                 {
                     tiempoAnimacion++;
                 if(tiempoAnimacion<2)
                     this.setImage(EstrellaIzq[0]);
               else 
                    if(tiempoAnimacion<4)
                         this.setImage(EstrellaIzq[1]);
                    else
                        if(tiempoAnimacion<6)
                            this.setImage(EstrellaIzq[2]);
                            else           
                            if(tiempoAnimacion<8)
                                this.setImage(EstrellaIzq[3]);
                            else 
                                if(tiempoAnimacion==10)
                                    tiempoAnimacion=0;
                    }else
                    if(poderEscudo==true)
                    {
                          tiempoAnimacion++;
                 if(tiempoAnimacion<2)
                     this.setImage(EscudoIzq[0]);
               else 
                    if(tiempoAnimacion<4)
                         this.setImage(EscudoIzq[1]);
                    else
                        if(tiempoAnimacion<6)
                            this.setImage(EscudoIzq[2]);
                            else           
                            if(tiempoAnimacion<8)
                                this.setImage(EscudoIzq[3]);
                            else 
                                if(tiempoAnimacion==10)
                                    tiempoAnimacion=0;
                    }
                setLocation(this.getX()-speed,this.getY());
               
               }
       
    /**
     * Si el jugador toda una pared o una planta estos metodos lo liberan del ciclo
     */
    public void release_up()
    {
        
        Pared blk=(Pared)getOneIntersectingObject(Pared.class);
        Plant wll=(Plant)getOneIntersectingObject(Plant.class);
        if(blk!=null || wll!=null){
            setLocation(getX(), getY() + speed);
        }
    }
    public void release_down()
    {
        
        Pared blk=(Pared)getOneIntersectingObject(Pared.class);
        Plant wll=(Plant)getOneIntersectingObject(Plant.class);
        if(blk!=null || wll!=null){
            setLocation(getX(), getY() - speed);
        }
    }
    public void release_left()
    {
        
        Pared blk=(Pared)getOneIntersectingObject(Pared.class);
        Plant wll=(Plant)getOneIntersectingObject(Plant.class);
        if(blk!=null || wll!=null){
            setLocation(getX() + speed, getY());
        }
    }
    public void release_right()
    {
        
        Pared blk=(Pared)getOneIntersectingObject(Pared.class);
        Plant wll=(Plant)getOneIntersectingObject(Plant.class);
        if(blk!=null || wll!=null){
            setLocation(getX() - speed, getY());
        }
    }
    /**
     * Al momento de presionar space crea una bomba en la misma posicion que el jugador
       */
           public void creaBomba()
        {
            
             if(Greenfoot.isKeyDown("space"))
                {
                    bombas=1;
                    if(poderBomba==true)
                    {
                       contadorBombas--;
                    }
                        getWorld().addObject(new Bomba(),this.getX(),this.getY());
                        
               }
    }
    
    /**
     * Checa si se toco la esrella
       */
        public void checaPoderEstrella()
        {
            if(this.isTouching(Estrella.class))
            {
                estrella.play();
                ((MundoBob)getWorld()).setScore(50);
                poderEstrella=true;
                removeTouching(Estrella.class);
                timer.mark();
                
            }
        }
        /**
         * Checa si se toco el escudo
           */
        public void checaPoderEscudo()
        {
            if(this.isTouching(Escudo.class))
            {
                ((MundoBob)getWorld()).setScore(50);
                escudo.play();
                poderEscudo=true;
                timer.mark();
                
                removeTouching(Escudo.class);
                
            }
        }
        /**
         * Checa si se toco un corazon y aumenta vidas
        */
        public void checaPoderVida()
        {
            if(this.isTouching(VidaExtra.class))
            {
                ((MundoBob)getWorld()).setScore(50);
                vida.play();
                ((MundoBob)getWorld()).setVidas(1);
                  removeTouching(VidaExtra.class);
            
            }
        }
        /**
         * Checa si se toco la superbombas
           */
        public void checaPoderBomba()
        {
            if(this.isTouching(SuperBomba.class))
            {
                ((MundoBob)getWorld()).setScore(50);
                poderBomba=true;
                contadorBombas=2;
                removeTouching(SuperBomba.class);
            }
        }
        /**
         * Checa si se toco las llaves, y las incrementa
           */
         public void checaLlaves()
        {
            if(this.isTouching(Llave.class))
            {
                ((MundoBob)getWorld()).setScore(100);
                llave.play();
                ((MundoBob)getWorld()).setLlaves(1);
                 removeTouching(Llave.class);
                  }
        }
        
        
        public boolean getSuperBomba()
        {
            return poderBomba;
        }
        
    /**Metodo para checar las colisiones con los enemigos*/
        public void checaEnemigos()
        {
            if(this.isTouching(Barril.class))
            {
                if(poderEstrella==false&&poderEscudo==false)
                {
                   ((MundoBob)getWorld()).setVidas(-1);
                   setLocation(((MundoBob)getWorld()).getBobPosX(),((MundoBob)getWorld()).getBobPosY());   
                }
                else
                    if(poderEstrella==true)
                {
                    ((MundoBob)getWorld()).setScore(100);
                    removeTouching(Barril.class);
                }
                
            }
            if(this.isTouching(Fantasma.class)||this.isTouching(Snake.class))
            {
                if(poderEstrella==false&&poderEscudo==false)
                {                 
                    int vidas=((MundoBob)getWorld()).getVidas();
                    ((MundoBob)getWorld()).setVidas(-vidas);
           
                }
                else
                    if(poderEstrella==true)
                {

                    ((MundoBob)getWorld()).setScore(100);
                    removeTouching(Fantasma.class);
                }
                
            }
            
            
            if(this.isTouching(Globo.class))
            {
                if(poderEstrella==false&&poderEscudo==false&&poderBomba==false)
                {

                    ((MundoBob)getWorld()).setVidas(-1);
                    setLocation(((MundoBob)getWorld()).getBobPosX(),((MundoBob)getWorld()).getBobPosY());   
               
                }
                else
                    if(poderEstrella==true)
                    {

                        poderEstrella=false;
                        setLocation(((MundoBob)getWorld()).getBobPosX(),((MundoBob)getWorld()).getBobPosY());   
              
                    }
                    else
                        if(poderEscudo==true)
                        {

                            poderEscudo=false;
                            setLocation(((MundoBob)getWorld()).getBobPosX(),((MundoBob)getWorld()).getBobPosY());   
              
                        }
                        else
                            if(poderBomba==true)
                            {

                                 poderBomba=false;
                                setLocation(((MundoBob)getWorld()).getBobPosX(),((MundoBob)getWorld()).getBobPosY());   
              
                            }
                
            }
            
        }
        
    /**Checa si el jugador ya perdio*/
        void checaMuerte()
        {
            if(((MundoBob)getWorld()).getVidas()==0)//||((MundoBob)getWorld()).getScore()<0)
            {
               ((MundoBob)getWorld()).pierde();
               
            }
            
        }
        
    /**Guarda el score en el scoreboard*/
        public void guardaPuntos()
        {
                int sc=((MundoBob)getWorld()).getScore();
                
                if (UserInfo.isStorageAvailable()) 
                {
            UserInfo myInfo = UserInfo.getMyInfo();
            if (sc > myInfo.getScore() || myInfo.getScore()==0) 
            {
                myInfo.setScore(sc);
                myInfo.store();  // write back to server
            }
        }
             
      }     
    
    /**Checa si ya gano el jugador*/
         void checaGana()
        {
            if(((MundoBob)getWorld()).getLlaves()==15)
            {
               ((MundoBob)getWorld()).gana();
            }
           
        }
}